{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#reading dataset\n",
    "import pandas as pd\n",
    "\n",
    "#group multiple files\n",
    "import glob\n",
    "\n",
    "#word2vec\n",
    "import gensim.models.word2vec as w2v\n",
    "\n",
    "#concurrency\n",
    "import multiprocessing\n",
    "\n",
    "#dealing with operating system , like reading file\n",
    "import os\n",
    "\n",
    "#dimensionality reduction\n",
    "import sklearn.manifold\n",
    "\n",
    "#visualization\n",
    "import seaborn as sns\n",
    "\n",
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "file_names = sorted(glob.glob('data/*.csv'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TOTAL 160015 words\n"
     ]
    }
   ],
   "source": [
    "#Copy all words (tags) describing various objects into a new big array 'sentences'.\n",
    "\n",
    "sentences = []\n",
    "total_words = 0\n",
    "\n",
    "for file_name in file_names:\n",
    "    df = pd.read_csv(file_name)\n",
    "    \n",
    "    num_of_words = 0\n",
    "\n",
    "    for index, row in df.iterrows():\n",
    "        \n",
    "        sentence = row[2].lower().split(';')\n",
    "        sentences.append(sentence)\n",
    "        \n",
    "        num_of_words += len(sentence)\n",
    "\n",
    "    total_words += num_of_words\n",
    "    \n",
    "print('TOTAL ' + str(total_words) + ' words')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Dimensionality of the resulting word vectors\n",
    "#more dimensions means more training time, but more generalized\n",
    "num_features = 300\n",
    "\n",
    "#Minimum word count threshold.\n",
    "min_word_count = 3\n",
    "\n",
    "#Number of threads to run in parallel.\n",
    "num_workers = multiprocessing.cpu_count()\n",
    "\n",
    "#Context window length.\n",
    "context_size = 7\n",
    "\n",
    "#Downsample setting for frequent words.\n",
    "#Rate: 0 to 1e-5 (How often to use?)\n",
    "downsampling = 1e-3\n",
    "\n",
    "#Seed for the RNG, to make the results reproducible.\n",
    "seed = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "text2vec = w2v.Word2Vec(\n",
    "    sg = 1,\n",
    "    seed = seed,\n",
    "    workers = num_workers,\n",
    "    size = num_features,\n",
    "    min_count = min_word_count,\n",
    "    window = context_size,\n",
    "    sample = downsampling\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "text2vec.build_vocab(sentences)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "text2vec vocabulary length: 557\n"
     ]
    }
   ],
   "source": [
    "print('text2vec vocabulary length: ' + str(len(text2vec.wv.vocab)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/Sailesh/anaconda/lib/python2.7/site-packages/ipykernel_launcher.py:2: DeprecationWarning: Call to deprecated `iter` (Attribute will be removed in 4.0.0, use self.epochs instead).\n",
      "  \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(482881, 800075)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#train model on sentneces\n",
    "text2vec.train(sentences, total_examples = text2vec.corpus_count, epochs = text2vec.iter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "#save model\n",
    "if not os.path.exists(\"trained\"):\n",
    "    os.makedirs(\"trained\")\n",
    "\n",
    "text2vec.save(os.path.join(\"trained\", \"text2vec.w2v\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "#squash dimensionality to 2\n",
    "#https://www.oreilly.com/learning/an-illustrated-introduction-to-the-t-sne-algorithm\n",
    "tsne = sklearn.manifold.TSNE(n_components=2, random_state=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "#put it all into a giant matrix\n",
    "all_word_vectors_matrix = text2vec.wv.vectors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "#train t sne (takes time if it's a huge dataset to train)\n",
    "all_word_vectors_matrix_2d = tsne.fit_transform(all_word_vectors_matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "#plot points in 2d space\n",
    "points = pd.DataFrame(\n",
    "    [\n",
    "        (word, coords[0], coords[1])\n",
    "        for word, coords in [\n",
    "            (word, all_word_vectors_matrix_2d[text2vec.wv.vocab[word].index])\n",
    "            for word in text2vec.wv.vocab\n",
    "        ]\n",
    "    ],\n",
    "    columns=[\"word\", \"x\", \"y\"]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1a20c17f90>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x864 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.set_context(\"poster\")\n",
    "\n",
    "#plot\n",
    "points.plot.scatter(\"x\", \"y\", s=10, figsize=(20, 12))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Processing the input_sentence\n",
    "\n",
    "#split sentence into a list of words and remove unwanted words\n",
    "\n",
    "def sentence_to_wordlist(sentence):\n",
    "    words = sentence.split(' ')\n",
    "    words = [word.lower() for word in words]\n",
    "        \n",
    "    unwanted_words = set(['also', 'on', 'side', 'one', 'them', 'which', 'around', 'in', 'at', 'of', 'with', 'besides', 'only', 'kept', 'was', 'been', 'had', 'he', 'she', 'my', 'his', 'her', 'their', 'those', 'as', 'our', 'there', 'are', 'is', 'a', 'and', 'placed', 'the', 'has', 'having', 'it', 'this', 'that', 'just', 'which', 'have', 'where', 'they'])\n",
    "\n",
    "    words_list = [word for word in words if word not in unwanted_words]\n",
    "            \n",
    "    return words_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_sentence = 'there are 2 chair in the front 1 at the '"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['chair', 'above', 'table']\n",
      "[1, 1]\n",
      "[-6, -5]\n"
     ]
    }
   ],
   "source": [
    "words = sentence_to_wordlist(input_sentence)\n",
    "print(words)\n",
    "\n",
    "object_num = []\n",
    "object_pos = []\n",
    "\n",
    "pos = {'left':-1, 'right':-2, 'front':-3, 'back':-4, 'default':-5, 'above':-6}\n",
    "\n",
    "i = 0\n",
    "n = 1\n",
    "while i < len(words):\n",
    "    \n",
    "    if (ord(words[i][0]) > 48 and ord(words[i][0]) < 58):\n",
    "        n = int(words[i])\n",
    "        object_num.append(n)\n",
    "        \n",
    "        if (i+2 < len(words) and words[i+2] not in pos):\n",
    "            if (n == 1):\n",
    "                object_pos.append(pos['back'])\n",
    "            elif (n == 2):\n",
    "                object_pos.append(pos['left'])\n",
    "                object_pos.append(pos['right'])\n",
    "            elif (n == 3):\n",
    "                object_pos.append(pos['left'])\n",
    "                object_pos.append(pos['right'])\n",
    "                object_pos.append(pos['back'])\n",
    "            elif (n == 4):\n",
    "                object_pos.append(pos['front'])\n",
    "                object_pos.append(pos['left'])\n",
    "                object_pos.append(pos['right'])\n",
    "                object_pos.append(pos['back'])\n",
    "        elif (i+2 < len(words)):\n",
    "            for j in range(n):\n",
    "                object_pos.append(pos[words[i+2]])\n",
    "        i += 1\n",
    "        \n",
    "    elif words[i] in text2vec.wv.vocab:\n",
    "        object_num.append(1)\n",
    "        if (i+1 < len(words) and words[i+1] in pos):\n",
    "            object_pos.append(pos[words[i+1]])\n",
    "        else:\n",
    "            object_pos.append(pos['default'])\n",
    "    \n",
    "    i += 1\n",
    "    \n",
    "print(object_num)\n",
    "print(object_pos)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['no. 14 chair', 'work table']"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "words_list = [text2vec.wv.most_similar(word)[random.randrange(0,5)][0] for word in words if word in text2vec.wv.vocab]\n",
    "words_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [],
   "source": [
    "#search for the id of object; you have the tag.\n",
    "\n",
    "def retrive_object_paths(words_list):\n",
    "    file_names = sorted(glob.glob('data/*.csv'))\n",
    "    object_paths = []\n",
    "    \n",
    "    for word in words_list:\n",
    "        ids = []\n",
    "        folders = []\n",
    "\n",
    "        for file_name in file_names:\n",
    "            df = pd.read_csv(file_name)\n",
    "\n",
    "            for index, row in df.iterrows():\n",
    "                sentence = row[2].lower().split(';')\n",
    "\n",
    "                if (word in sentence and row[0] not in ids):\n",
    "                    ids.append(row[0])\n",
    "                    folders.append(row[1])\n",
    "\n",
    "        print('\\n' + word + ' ------ ' + str(len(ids)) + ' images')\n",
    "        \n",
    "        x = random.randrange(0, len(ids))\n",
    "\n",
    "        id = ids[x][4:]\n",
    "        folder = folders[x]\n",
    "        path = '/Users/Sailesh/Documents/CS/Projects/CDSAML/text2scene/ShapeNetCore.v1/'+ folder + '/' + id + '/model.obj'\n",
    "        \n",
    "        if(';' in folder):\n",
    "            folder_list = folder.split(';')\n",
    "            for folder in folder_list:\n",
    "                path = '/Users/Sailesh/Documents/CS/Projects/CDSAML/text2scene/ShapeNetCore.v1/'+ folder + '/' + id + '/model.obj'\n",
    "                if os.path.exists(path):\n",
    "                    break\n",
    "\n",
    "        print('choosing 1 at random...')\n",
    "        print('PATH: ' + path)\n",
    "        \n",
    "        object_paths.append(path)\n",
    "        \n",
    "    return object_paths"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "no. 14 chair ------ 11 images\n",
      "choosing 1 at random...\n",
      "PATH: /Users/Sailesh/Documents/CS/Projects/CDSAML/text2scene/ShapeNetCore.v1/03001627/6921b41c2f6916e2bea04b36c2ada3a3/model.obj\n",
      "\n",
      "work table ------ 303 images\n",
      "choosing 1 at random...\n",
      "PATH: /Users/Sailesh/Documents/CS/Projects/CDSAML/text2scene/ShapeNetCore.v1/04379243/b8ffc016a4e080a6d2e5fdcf2bc010e2/model.obj\n"
     ]
    }
   ],
   "source": [
    "paths = retrive_object_paths(words_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [],
   "source": [
    "#save all in a new file\n",
    "\n",
    "f = open(\"object_path.txt\",\"w\")\n",
    "\n",
    "k = 0\n",
    "for i in range(len(paths)):\n",
    "    f.write(paths[i] + '\\n')\n",
    "    f.write(str(object_num[i]) + '\\n')\n",
    "    for j in range(object_num[i]):\n",
    "        f.write(str(object_pos[j+k]) + '\\n')\n",
    "    k += j+1\n",
    "    \n",
    "f.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#open blender through terminal by using subprocess\n",
    "import subprocess\n",
    "subprocess.call('/Applications/Blender/blender.app/Contents/MacOS/blender --python3 blender.py', cwd='/Users/Sailesh/Documents/CDSAML/text2image', shell=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  },
  "widgets": {
   "state": {},
   "version": "1.1.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
